package com.koi.generator.utils;

import freemarker.cache.NullCacheStorage;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 * @author ･ᴗ･
 * @description [FreeMarkerTemplateUtil-FreeMarker模版工具类]
 */
@Slf4j
public class FreeMarkerTemplateUtil {

    public FreeMarkerTemplateUtil() {
    }

    public static final Configuration CONFIGURATION = new Configuration(Configuration.VERSION_2_3_31);

    static {
        try {
            // ClassTemplateLoader方式：这个部署之后也可以，但是需要将模版放在FreeMarkerTemplateUtils类所在的包，加载模版时会从该包下加载。[根据相对路径加载，舍弃]
            // CONFIGURATION.setTemplateLoader(new ClassTemplateLoader(FreeMarkerTemplateUtils.class,""));
            // 在本地调试的获取的是本地磁盘对应的绝对路径，但是项目打包发布到服务器后根据绝对路径获取静态文件肯定是不行的。[根据绝对路径加载，本地开发环境可以，上线环境不行，舍弃]
            // String path = URLDecoder.decode(FreeMarkerTemplateUtil.class.getClassLoader().getResource("").getPath(), StandardCharsets.UTF_8);
            // 所以使用此方式进行设置模板加载的类加载器
            CONFIGURATION.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(), "");
            CONFIGURATION.setDefaultEncoding("UTF-8"); // 设置默认编码
            CONFIGURATION.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); // 设置异常处理方式
            CONFIGURATION.setCacheStorage(NullCacheStorage.INSTANCE);  // 禁用缓存
            CONFIGURATION.setClassicCompatible(true);
        } catch (Exception e) {
            log.error(e.getMessage());
            e.printStackTrace();
        }
    }

    public static Template getTemplate(String templateName) throws IOException {
        try {
            System.out.println("templateName: " + templateName);
            return CONFIGURATION.getTemplate(templateName);
        } catch (IOException e) {
            throw e;
        }
    }

    public static void clearCache() {
        CONFIGURATION.clearTemplateCache();
    }
}
